Google Cloud FunctionsをServerless Frameworkで環境構築してみる
本記事では、Google Cloud Functionsの構成要素などをServerless Frameworkで構築していきます。基本的に以下の公式ガイドを参照しています。
AWSのサーバーレス環境構築では、対応しているプラグインの数も多いことから、真っ先にServerless Frameworkを選択していますが、Google Cloudにおいても同様なのでしょうか?その辺りの手触り感を確認していきます。
環境構築
検証時の実施環境は以下の通りです。
- macOS Big Sur 11.6
- Node.js: v16.11.1 (nodebrewで構築)
- npm: 8.1.0
- Serverless Framework
- Framework Core: 2.62.0
- Plugin: 5.4.7
- SDK: 4.3.0
- Components: 3.17.1
- 開発言語
- Go 1.16.5 (homebrewで構築)
まずInstallationに沿って、Serverless Framework本体をインストールします。
$ npm install -g serverless
続いてQuick Startに沿って、リポジトリの作成します。公式のテンプレートからリポジトリを新規作成します。
$ serverless create --template google-go --path sls-gcp Serverless: Generating boilerplate... Serverless: Generating boilerplate in "/Users/haruta.takumi/go/sls-gcp" Serverless: Successfully generated boilerplate for template: "google-go" $ cd sls-gcp $ ls Makefile fn.go fn_test.go serverless.yml
serverless-google-cloudfunctions
をローカルにインストールします。
$ npm install --save serverless-google-cloudfunctions $ cat package.json { "dependencies": { "serverless-google-cloudfunctions": "^4.4.0" } } $ ls Makefile fn.go fn_test.go node_modules package-lock.json package.json serverless.yml
デプロイにはGoogle Cloud側のCredentials情報が必要です。Google Cloudの任意のプロジェクトにて、API Dashboardから以下のAPIを有効化します。
- Cloud Functions API
- Cloud Deployment Manager V2 API
- Cloud Build API
- Cloud Storage
- Cloud Logging API
続いてService Accountを発行します。IAM & Adminの画面から左メニューのService Accounts
をクリックします。
Create service account
をクリックします。
サービスアカウント名を記入します。今回はServerless Framework側のリポジトリ名と合わせて sls-gcp
としました。
以下のロールをアタッチします。
- Deployment Manager Editor
- Storage Admin
- Logging Admin
- Cloud Functions Developer
サービスアカウントに対する他のユーザー・グループのアクセス権限は、今回は付与しなくて大丈夫です。空欄のままDone
をクリックして作成完了です。
続いて認証に使うKeyを作成します。先ほど作成したサービスアカウントをクリックします。
KeysのタブからADD KEY
をクリックし、認証情報の入ったJSONファイルをダウンロードします。JSONファイルは~/.gcloud/
に配置しておきましょう。
デプロイ前にserverless.yml
の記述を以下のように修正します。
service: sls-gcp provider: name: google runtime: go116 # 2021年10月17日時点ではプレビュー region: asia-northeast1 project: haruta-takumi credentials: ~/.gcloud/haruta-takumi-sls-gcp.json frameworkVersion: '2' plugins: - serverless-google-cloudfunctions package: exclude: - .npmignore - node_modules/** - package-lock.json - package.json functions: hello: handler: Hello # fn.go内の関数名 events: - http: path
sls deploy
を実行します。出力ログ的にコンパイルもServerless Framework側でやってくれていますね。
$ sls deploy Serverless: Configuration warning at 'provider.runtime': should be equal to one of the allowed values [nodejs6, nodejs8, nodejs10, nodejs12, nodejs14, python37, python38, go111, go113, java11, dotnet3, ruby26, ruby27] Serverless: Serverless: Learn more about configuration validation here: http://slss.io/configuration-validation Serverless: Serverless: Packaging service... Serverless: Excluding development dependencies... Serverless: Compiling function "hello"... Serverless: Creating deployment... Serverless: Checking deployment create progress... .... Serverless: Done... Serverless: Uploading artifacts... Serverless: Artifacts successfully uploaded... Serverless: Updating deployment... Serverless: Checking deployment update progress... ....................................................... Serverless: Done... Service Information service: sls-gcp project: haruta-takumi stage: dev region: asia-northeast1 Deployed functions hello https://asia-northeast1-haruta-takumi.cloudfunctions.net/sls-gcp-dev-hello
Cloud Functions側では下記のような設定の下デプロイされてました。
関数の中身も確認できます。
先にDeployment ManagerのRoleを付与した通り、Serverless Frameworkの裏ではDeployment Managerによってリソースが生成されています。生成されたリソースはCloud StorageのバケットとCloud Functionです。
気になった点
今のServerless FrameworkでGoogle Cloudにデプロイすると、2回目以降も約7分くらい時間がかかってしまいます。Goランタイムだと遅いのか原因が掴みきれてないですが。デプロイする度にVersionが2つずつ上っていたり、リソースの差分だけ更新していなかったりと、挙動に無駄が多いのかなと予想しています。(差分更新せずに、都度新しいリソースを生成する仕様に関しては、Deployment Managerそのものの仕様だった気も)
Serverless Frameworkの開発自体もAWS向けがメインになっているみたいなので、AWSと同じ様な便利さを想像して使うには現段階では少し厳しいかなと感じました。表面的に使ってみての感想なので、あまり間には受けないでください。実際にServerless FrameworkでGoogle Cloudを使っている方がおりましたら、所感を聞いてみたいところです。
ひとまず個人としては、TerraformやDeployment Manager直で使うなどして代替案を探っていきます。